home *** CD-ROM | disk | FTP | other *** search
/ Euroscene 2 / Euroscene 2.iso / USEFUL / DeliTracker130 / Developer / Developer.run / Examples / EMS.s < prev    next >
Encoding:
Text File  |  1992-09-23  |  12.7 KB  |  585 lines

  1.  
  2.     incdir    "Includes:"
  3.     include    "misc/DeliPlayer.i"
  4.  
  5. ;
  6. ;
  7.     SECTION Player,Code
  8. ;
  9. ;
  10.  
  11.     PLAYERHEADER PlayerTagArray
  12.  
  13.     dc.b '$VER: Editeur Musical Séquentiel 1.22 player module V1.0 (10 Aug 92)',0
  14.     even
  15.  
  16. PlayerTagArray
  17.     dc.l    DTP_PlayerVersion,1
  18.     dc.l    DTP_PlayerName,PName
  19.     dc.l    DTP_Creator,CName
  20.     dc.l    DTP_Check2,Chk
  21.     dc.l    DTP_Interrupt,ems_music
  22.     dc.l    DTP_InitPlayer,InitPlay
  23.     dc.l    DTP_EndPlayer,EndPlay
  24.     dc.l    DTP_InitSound,InitSnd
  25.     dc.l    DTP_EndSound,EndSnd
  26.     dc.l    TAG_DONE
  27.  
  28. *-----------------------------------------------------------------------*
  29. ;
  30. ; Player/Creatorname und lokale Daten
  31.  
  32. PName        dc.b 'EMS',0
  33. CName        dc.b 'by Thomas Pimmel ©Ringard'' Production,',10
  34.         dc.b 'adapted by Delirium',0
  35.     even
  36.  
  37. *-----------------------------------------------------------------------*
  38. ;
  39. ; Testet auf EMS-Modul
  40.  
  41. Chk
  42.     move.l    dtg_ChkData(a5),a0
  43.  
  44.     move.w    4(a0),d2            ; #pattern
  45.     beq.s    ChkFail
  46.     mulu    #1024,d2
  47.     addi.l    #$538,d2
  48.  
  49.     lea    134(a0),a0
  50.     moveq    #14,d0
  51. ChkLoop
  52.     moveq    #0,d1
  53.     move.w    len(a0),d1
  54.     add.l    d1,d1
  55.     add.l    d1,d2
  56.     lea    12(a0),a0
  57.     dbra    d0,ChkLoop
  58.  
  59.     sub.l    dtg_ChkSize(a5),d2        ; test size of module
  60.     cmpi.l    #-64,d2                ; - 64 Bytes
  61.     blt.s    ChkFail                ; too small
  62.     cmpi.l    #+64,d2                ; + 64 Bytes
  63.     bgt.s    ChkFail                ; too big
  64.  
  65.     moveq    #0,d0                ; Modul erkannt
  66.     bra.s    ChkEnd
  67. ChkFail
  68.     moveq    #-1,d0                ; Modul nicht erkannt
  69. ChkEnd
  70.     rts
  71.  
  72. *-----------------------------------------------------------------------*
  73. ;
  74. ; Init Player
  75.  
  76. InitPlay
  77.     moveq    #0,d0
  78.     move.l    dtg_GetListData(a5),a0        ; Function
  79.     jsr    (a0)
  80.     move.l    a0,ems_raw
  81.  
  82.     move.l    dtg_AudioAlloc(a5),a0        ; Function
  83.     jsr    (a0)                ; returncode is already set !
  84.     rts
  85.  
  86. *-----------------------------------------------------------------------*
  87. ;
  88. ; End Player
  89.  
  90. EndPlay
  91.     move.l    dtg_AudioFree(a5),a0        ; Function
  92.     jsr    (a0)
  93.     rts
  94.  
  95. *-----------------------------------------------------------------------*
  96. ;
  97. ; Init Module
  98.  
  99. InitSnd
  100.     bsr    ems_init
  101.     rts
  102.  
  103. *-----------------------------------------------------------------------*
  104. ;
  105. ; Clean up Module
  106.  
  107. EndSnd
  108.     moveq    #0,d0
  109.     lea    $dff000,a0
  110.     move.w    d0,$a8(a0)
  111.     move.w    d0,$b8(a0)
  112.     move.w    d0,$c8(a0)
  113.     move.w    d0,$d8(a0)
  114.     move.w    #$f,$96(a0)
  115.     rts
  116.  
  117. *-----------------------------------------------------------------------*
  118. ;
  119. ; Editeur Musical Séquentiel V1.22 - Replay
  120.  
  121. ;--------EMS Fast replay V1.22
  122. ;--------Thomas Pimmel 11/02/91
  123. ;--------©Ringard' Production 1991
  124. ;--------Pour devpac 2, facile à adapter à un autre asm. (sauf seka)
  125.  
  126. ;Routine destinée à prendre place dans votre source...
  127. ;Voilà une version optimisée de la routine de EMSPlayer.asm
  128. ;D'après mes calculs elle est plus rapide que les versions
  129. ;équivalentes sur SoundTracker
  130. ;car : 1 pas de recherche de la plus grd partition (c'est dans le format)
  131. ;et surtout : 2 l'initialisation du DMA ce fait
  132. ;étalé dans le temps, sur 2/50 de secondes
  133. ;premier temps, on recherche les voies DMA à couper, c'est
  134. ;indispensable de le faire le plus rapidement possible.
  135. ;Ensuite on documente les variables EMS_SON0/1/2/3
  136. ;on y sauve le repeat, len, replen, addrs, vol.
  137. ;On passe ensuite aux commandes (très rapide)
  138. ;Enfin on initialise les canaux dma
  139. ;on attend le balayage suivant pour mettre en place la répétition
  140. ;d'un son -> vitesse limitée à 1. Ce n'est pas vraiement une
  141. ;contrainte.
  142. ;Attention, cette routine a été optimisée au niveau de la structure
  143. ;et de son organisation dans le temps.
  144. ;Elle peut l'être encore, au niveau des instructions.
  145. ;Mais n'oubliez pas : cette routine doit tourner sur toutes
  146. ;les machines (pas de temporisations par boucle (beurk))
  147. ;J'ai préféré ne pas trop la rendre illisible par
  148. ;un max de lea    -$145(a0,d0.w),-(a7)+ (?(c'est la pré-post-incrédémentation))
  149. ;Si dans un jeu, une démo... vous voulez disposer d'une voie pour
  150. ;les effets spéciaux il suffit de remplacer les moveq    #3,dn
  151. ;par moveq    #2,dn.
  152. ;Une dernière chose, la longueur en temps prise par une routine
  153. ;de musique EST LE TEMPS MAXIMUM PRIS PAR ELLE AU LONG
  154. ;de votre jeu, démo etc... Ainsi il est quasi inutile
  155. ;de l'optimiser, par exemple en dressant un pointeur sur la
  156. ;musique au lieu du fastidieux calcul de l'offset de la séquence
  157. ;car de toute façon lors d'un appel suivant il faudra le faire
  158. ;et le temps qu'il restera à votre prog. principal diminuera.
  159. ;Je ne sais pas si j'étais clair (il se fait tard).
  160. ;Les noms de labels commencent tous par EMS_
  161. ;c'est une reprise des sources soundtrackers, car c'est
  162. ;très pratique.
  163. ;L'adresse de la musique est contenue dans une variable
  164. ;(ems_raw) car c'est plus pratique dans le cas ou vous maniez
  165. ;plusieurs musiques.
  166. ;******
  167. ;La seule optimisation réelle que je voudrais faire
  168. ;est celle qui consisterait à appeler les différentes
  169. ;routines par interruptions du copper. Ouaih, mais
  170. ;ça ne donnerait pas une routine simple à interfacer
  171. ;avec votre prog.
  172. ;Vraiement je suis bavard, mais un dernier conseil important
  173. ;ou plutôt deux : si vous faites un effet de fade-in ou out
  174. ;(je ne sais si ça ce dit pour le son), c'est à dire que
  175. ;vous faites diminuer progressivement le son de toute la
  176. ;musique, pensez à règler le volume AVANT de lancer le son
  177. ;suivant, sinon vous aurez un claquement dans vos bafffles.
  178. ;Je viens d'écouter la Coma demo des Rebels (géniale par ailleurs)
  179. ;qui souffre justement de ce problème.
  180. ;C'est d'ailleurs pour cette raison que les commandes sont
  181. ;executées entre la coupure des canaux DMA et leur lancement.
  182. ;Deux sous-prog (voir EMSPlayer.asm)
  183. ;EMS_INIT à appeler en 1er
  184. ;Tous les 1/50èmes de seconde EMS_MUSIC
  185. ;------------------------Good luck, comme disent nos frères anglophiles
  186. ;-----------------------------------------------Tom von Ringard'
  187. ;--offset dma
  188. c_per = 6
  189. c_len = 4
  190. c_vol = 8
  191. ;--offset ems
  192. per = 12
  193. len = 4
  194. rep = 6
  195. replen = 8
  196. vol = 10
  197.     ;--init morceau
  198. ems_init
  199.     move.w    #$f,$dff096        ;couper son
  200.     move.w    #6,ems_reset
  201.     clr.w    ems_ligne        ;ligne 0
  202.     clr.w    ems_posi        ;position 0
  203.     move.w    ems_reset,ems_count    ;init compteur
  204.     move.l    ems_raw,a0
  205.     move.w    2(a0),ems_length
  206.     ;+ grande partition
  207.     moveq    #0,d1
  208.     move.w    4(a0),d1
  209.     ;--trouver les sons
  210.     move.l    a0,d0            ;début musique
  211.     add.l    #$538,d0        ;début partitions
  212.     lsl.l    #5,d1
  213.     lsl.l    #5,d1
  214.     add.l    d1,d0            ;début sons
  215.     moveq    #14,d3            ;15 sons
  216.     lea    134(a0),a0
  217. .loop    ;mettre adresse des sons dans table
  218.     moveq    #0,d1
  219.     move.w    len(a0),d1
  220.     tst.w    d1
  221.     beq.s    .jmp            ;pas de son
  222.     move.l    d0,a1
  223.     clr.w    (a1)            ;pour repeat
  224.     move.l    d0,(a0)
  225.     lsl.l    #1,d1
  226.     add.l    d1,d0
  227. .jmp
  228.     lea    12(a0),a0        ;son suivant
  229.     dbf    d3,.loop
  230.     ;--val première partition
  231.     move.l    ems_raw,a0
  232.     moveq    #0,d0
  233.     move.b    6(a0),d0
  234.     move.w    d0,ems_part
  235.     ;--tout est bien
  236.     rts
  237.     ;-------------interruption
  238. ems_music
  239.     movem.l    d0-7/a0-6,-(a7)
  240.     bsr.s    ems_play
  241.     movem.l    (a7)+,d0-7/a0-6
  242.     rts
  243. ems_play
  244.     move.w    ems_count,d0
  245.     tst.w    d0
  246.     beq.s    ems_playseq
  247.     cmp.w    ems_reset,d0
  248.     beq    ems_repeat    ;faire répétition des sons
  249. ems_retrepeat            ;addrs de retour
  250.     subq.w    #1,ems_count
  251.     bra    ems_makvib    ;commande au 1/50ème et rts
  252. ems_playseq
  253.     ;--effacer le signal
  254.     lea    ems_vibrato,a0
  255.     clr.w    (a0)
  256.     clr.w    4(a0)
  257.     clr.w    8(a0)
  258.     clr.w    12(a0)
  259.     ;---jouer sequence
  260.     move.l    ems_raw,a5        ;partition
  261.     lea    $13A(a5),a5
  262.     moveq    #0,d0
  263.     move.w    ems_part,d0
  264.     lsl.l    #5,d0
  265.     lsl.l    #5,d0
  266.     move.w    ems_ligne,d1
  267.     lsl.w    #4,d1
  268.     add.l    d0,a5
  269.     add.w    d1,a5            ;ligne à jouer en a0
  270.     ;---tester les voies à couper
  271.     clr.w    ems_dmacon        ;init dmacon
  272.     ;-en a0 ligne à jouer
  273.     lea    ems_table,a1
  274.     moveq    #3,d3            ;nb canaux
  275.     moveq    #0,d0            ;offset
  276.     moveq    #1,d2            ;dmacon
  277.     ;--chercher canaux à éteindre
  278. ems_close
  279.     move.b    2(a5,d0.w),d1        ;num du son
  280.     lsr.b    #4,d1            ;correction
  281.     move.b    d1,(a1)+        ;valeur son en table
  282.     tst.b    d1            ;nul ?
  283.     beq.s    ems_sndchg        ;change pas de son
  284.     or.w    d2,ems_dmacon        ;changer dmacon
  285. ems_sndchg
  286.     lsl.w    #1,d2            ;canal dmacon suivant
  287.     addq.w    #4,d0            ;offset suivant
  288.     dbf    d3,ems_close
  289.     move.w    ems_dmacon,$dff096    ;couper
  290.     or.w    #$8000,ems_dmacon
  291.     ;----attendre
  292. ;    bsr    ems_initsuite
  293.     ;---période, tt_son et volume + commandes
  294.     lea    $dff0a0,a0        ;canal dma son
  295.     lea    ems_table,a1        ;num sons
  296.     lea    ems_son0,a2        ;table des sons
  297.     lea    ems_exe,a4        ;commandes
  298.     moveq    #3,d3    ;*4
  299.     moveq    #0,d0
  300.     ;période
  301. ems_loop
  302.     tst.w    (a5)            ;tst période
  303.     beq.s    ems_pnul
  304.     move.w    (a5),c_per(a0)        ;changer période
  305.     move.w    (a5),per(a2)        ;mémoriser
  306. ems_pnul
  307.     tst.w    (a5)+
  308.     ;addrs à zéro
  309.     clr.l    (a2)
  310.     ;numéro son
  311.     moveq    #0,d0
  312.     move.b    (a1)+,d0
  313.     tst.b    d0
  314.     beq.s    ems_nosample        ;pas de son
  315.     ;les sons
  316.     move.l    ems_raw,a3        ;la table des sons
  317.     lea    134(a3),a3
  318.     subq.w    #1,d0            ;base 0
  319.     mulu    #12,d0            ;offset
  320.     add.l    d0,a3            ;en a3 le son
  321.     move.l    (a3),(a2)        ;addrs
  322.     move.l    len(a3),len(a2)        ;longueur + repeat
  323.     move.l    replen(a3),replen(a2)    ;relen + vol
  324.     move.w    vol(a3),c_vol(a0)    ;volume dma
  325. ems_nosample
  326.     add.w    #$10,a0            ;dma suivant
  327.     add.w    #14,a2            ;mémorise son suivant 
  328.     move.w    (a5)+,(a4)+        ;jmp commandes&mémorise
  329.     dbra    d3,ems_loop
  330.     ;commandes
  331.     bsr    ems_com
  332.     ;--mettre en place les sons
  333.     moveq    #3,d3
  334.     lea    $dff0a0,a0
  335.     lea    ems_son0,a1
  336. ems_sloop
  337.     move.l    (a1),d0
  338.     tst.l    d0
  339.     beq.s    ems_nosnd
  340.     move.l    d0,(a0)
  341.     move.w    len(a1),c_len(a0)
  342. ems_nosnd
  343.     add.w    #$10,a0
  344.     add.w    #14,a1
  345.     dbf    d3,ems_sloop
  346.     bsr    ems_waitsuite        ;attendre canal ok
  347.     move.w    ems_dmacon,$dff096    ;run
  348.     tst.w    ems_break
  349.     bne.s    .jmp2
  350.     ;--incrementer
  351.     move.w    ems_ligne,d0
  352.     addq.w    #1,d0
  353.     cmp.w    #63,d0        ;overflow?
  354.     bls.s    .jmp
  355.     ;--changer de partition
  356.     bsr.s    ems_changepart
  357. .jmp
  358.     move.w    d0,ems_ligne
  359. .jmp2
  360.     clr.w    ems_break
  361.     move.w    ems_reset,ems_count
  362.     rts
  363. ;effectuer les répétitions des sons
  364. ems_repeat
  365.     moveq    #3,d3
  366.     lea    $dff0a0,a0
  367.     lea    ems_son0,a1
  368. ems_sloop2
  369.     move.l    (a1),d0
  370.     tst.l    d0
  371.     beq.s    ems_nosnd2
  372.     moveq    #0,d1
  373.     move.w    rep(a1),d1
  374.     lsl.l    #1,d1
  375.     add.l    d1,d0
  376.     move.l    d0,(a0)
  377.     move.w    replen(a1),c_len(a0)
  378. ems_nosnd2
  379.     add.w    #$10,a0
  380.     add.w    #14,a1
  381.     dbf    d3,ems_sloop2
  382.     bra    ems_retrepeat
  383. ;---changer de partition
  384. ems_changepart
  385.     moveq    #0,d1
  386.     move.w    ems_posi,d1
  387.     addq.w    #1,d1
  388.     move.w    ems_length,d2
  389.     cmp.w    d1,d2
  390.     bhi.s    ems_continu
  391.     moveq    #0,d1        ;position 0
  392. ems_continu
  393.     moveq    #0,d0        ;ligne 0
  394.     move.w    d1,ems_posi
  395.     move.l    ems_raw,a0
  396.     addq.l    #6,a0
  397.     moveq    #0,d2
  398.     move.b    (a0,d1.w),d2
  399.     move.w    d2,ems_part
  400.     rts
  401. ;---executes les commandes
  402. ems_com
  403.     lea    $dff0a0,a1
  404.     lea    ems_son0,a2
  405.     lea    ems_vibrato,a3
  406.     lea    ems_exe,a4
  407.     moveq    #3,d7
  408. ems_comloop
  409.     move.b    (a4),d0
  410.     and.b    #$f,d0        ;isole commande
  411.     tst.b    d0
  412.     beq.s    ems_no
  413.     moveq    #0,d1
  414.     move.b    1(a4),d1
  415.     cmp.b    #7,d0
  416.     beq.s    ems_vibra
  417.     cmp.b    #8,d0
  418.     beq.s    ems_cbreak
  419.     cmp.b    #9,d0
  420.     beq.s    ems_cspeed
  421.     cmp.b    #$a,d0
  422.     beq.s    ems_cled
  423.     cmp.b    #$b,d0
  424.     beq.s    ems_vibra
  425.     cmp.b    #$c,d0
  426.     beq.s    ems_vibra
  427.     cmp.b    #$d,d0
  428.     beq.s    ems_vibra
  429.     cmp.b    #$e,d0
  430.     beq.s    ems_cvol
  431.     cmp.b    #$f,d0
  432.     beq.s    ems_crep
  433. ems_no
  434.     addq.w    #2,a4
  435.     add.w    #$10,a1
  436.     add.w    #14,a2
  437.     addq.w    #4,a3
  438.     dbf    d7,ems_comloop
  439.     rts
  440. ;--commandes
  441. ems_cbreak    ;break partition
  442.     move.w    d1,ems_ligne
  443.     bsr    ems_changepart
  444.     move.w    #1,ems_break
  445.     bra.s    ems_no
  446. ems_cspeed
  447.     move.w    d1,ems_reset
  448.     bra.s    ems_no
  449. ems_cvol
  450.     move.w    d1,c_vol(a1)
  451.     move.w    d1,vol(a2)
  452.     bra.s    ems_no
  453. ems_vibra
  454.     move.w    d0,(a3)        ;commande
  455.     move.w    d1,2(a3)
  456.     bra.s    ems_no
  457. ems_cled
  458.     tst.b    d1
  459.     bne.s    ems_ledon
  460.     bclr    #1,$bfe001
  461.     bra.s    ems_no
  462. ems_ledon
  463.     bset    #1,$bfe001
  464.     bra.s    ems_no
  465. ems_crep    ;faire une répétition
  466.     move.w    len(a2),replen(a2)
  467.     bra.s    ems_no
  468. ;----------gestion vibrato
  469. ems_makvib
  470.     lea    $dff0a0,a0
  471.     lea    ems_vibrato,a1
  472.     lea    ems_son0,a2
  473.     moveq    #3,d0
  474. .loop
  475.     tst.w    (a1)
  476.     beq.s    .suite
  477.     ;--prep com
  478.     move.w    2(a1),d1    ;args
  479.     move.w    per(a2),d3
  480.     ;--what com
  481.     move.w    (a1),d2        ;com
  482.     cmp.b    #7,d2
  483.     beq.s    .voldown
  484.     cmp.b    #$c,d2        ;vibrato
  485.     beq.s    .up
  486.     cmp.b    #$b,d2        ;up
  487.     beq.s    .down
  488.     *****vibrato**********
  489. .vib
  490.     move.w    ems_count,d2
  491.     btst    #0,d2
  492.     bne.s    .vm
  493.     add.w    d1,d3
  494.     bra.s    .jmp
  495. .vm
  496.     sub.w    d1,d3
  497.     bra.s    .jmp
  498.     *****up&down**********
  499. .down
  500.     sub.w    d1,d3
  501.     bra.s    .jmpdown
  502. .up
  503.     add.w    d1,d3
  504. .jmpdown
  505.     *****control**********
  506.     cmp.w    #$6b0,d3
  507.     bhi.s    .suite
  508.     cmp.w    #$70,d3
  509.     bls.s    .suite
  510.     move.w    d3,per(a2)
  511.     *****partie commune***
  512. .jmp
  513.     move.w    d3,c_per(a0)
  514. .suite
  515.     add.w    #$10,a0
  516.     add.w    #14,a2
  517.     tst.l    (a1)+
  518.     dbf    d0,.loop
  519.     rts
  520.     ;volume down
  521. .voldown
  522.     move.w    vol(a2),d3
  523.     sub.w    d1,d3
  524.     bgt.s    .ok
  525.     moveq    #0,d3
  526. .ok
  527.     move.w    d3,vol(a2)
  528.     move.w    d3,c_vol(a0)
  529.     bra.s    .suite
  530. ;--gèrer temporisation
  531. ems_initsuite    ;valeur ligne en mem
  532. ;    move.b    $dff006,d6
  533. ;    addq.b    #4,d6        ;règlez cette valeur en fonction
  534. ;    ;de votre musique. Cette routine gère l'attente du DMA
  535. ;    ;c'est à dire le temps entre le lancement d'une commande
  536. ;    ;et la prise en compte de celle-ci par le dma.
  537. ;    ;attention, NE LANCEZ cette routine que lorsque le raster
  538. ;    ;est haut (rast<200), sinon boom!
  539. ;    move.w    d6,ems_oldligne
  540. ;    rts
  541. ems_waitsuite
  542. ;    move.w    ems_oldligne,d6
  543. ;b_cmp
  544. ;    move.b    $dff006,d5
  545. ;    cmp.b    d6,d5
  546. ;    bls.s    b_cmp
  547. ;    rts
  548.  
  549.     moveq    #4,d6
  550. b_get
  551.     move.b    $dff006,d5
  552. b_cmp
  553.     cmp.b    $dff006,d5
  554.     beq.s    b_cmp
  555.     dbf    d6,b_get
  556.     rts
  557.  
  558.     section    var,data
  559.  
  560. ems_vibsignal    dc.w    0
  561. ems_vibrato    dc.l    0,0,0,0
  562. ems_break    dc.w    0
  563. ems_count    dc.w    0
  564. ems_ligne    dc.w    0    ;ligne jouée
  565. ems_part    dc.w    0    ;partition jouée
  566. ems_posi    dc.w    0    ;position sequence
  567. ems_length    dc.w    0    ;longueur musique
  568. ems_reset    dc.w    0
  569. ems_table    dc.l    0    ;valeur des sons
  570. ems_sample    dc.l    0    ;*sample
  571. ems_dmacon    dc.w    0
  572. ems_son0    dc.l    0    ;addrs son canal 0
  573.         dc.w    0    ;longueur
  574.         dc.w    0    ;repeat
  575.         dc.w    0    ;replen
  576.         dc.w    0    ;volume
  577.         dc.w    0    ;periode
  578. ems_son1    dcb.w    7    ;idem canal1
  579. ems_son2    dcb.w    7    ;canal 2
  580. ems_son3    dcb.w    7    ;canal 3
  581. ems_exe        dc.l    0,0,0,0
  582. ems_oldligne    dc.l    0
  583. ems_raw        dc.l    0    ;adddrs du format musique&son brut
  584.  
  585.